 /*******************************************************************************
  * Copyright (c) 2003, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.progress;

 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IToolBarManager;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IViewPart;
 import org.eclipse.ui.IWorkbenchActionConstants;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
 import org.eclipse.ui.internal.WorkbenchImages;
 import org.eclipse.ui.part.ViewPart;
 import org.eclipse.ui.preferences.ViewPreferencesAction;

 /**
  * The VirtualProgressView is the class that shows the details of the current workbench
  * progress optimized for the display of visible items only.
  */
 public class VirtualProgressView extends ViewPart implements IViewPart {

     VirtualProgressViewer viewer;

     Action cancelAction;

     Action clearAllAction;


     /*
      * (non-Javadoc)
      *
      * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
      */
     public void createPartControl(Composite parent) {
         viewer = new VirtualProgressViewer(parent, SWT.MULTI);
         viewer.setComparator(ProgressManagerUtil.getProgressViewerComparator());

         viewer.getControl().setLayoutData(
                 new GridData(SWT.FILL, SWT.FILL, true, true));

         PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
                 IWorkbenchHelpContextIds.RESPONSIVE_UI);
         
         initContentProvider();
         createClearAllAction();
         createCancelAction();
         initContextMenu();
         initPulldownMenu();
         initToolBar();
         getSite().setSelectionProvider(viewer);
     }

     /*
      * (non-Javadoc)
      *
      * @see org.eclipse.ui.IWorkbenchPart#setFocus()
      */
     public void setFocus() {
         if (viewer != null) {
             viewer.setFocus();
         }
     }

     /**
      * Sets the content provider for the viewer.
      */
     protected void initContentProvider() {
         ProgressViewerContentProvider provider = new ProgressViewerContentProvider(viewer, true ,true);
         viewer.setContentProvider(provider);
         viewer.setInput(ProgressManager.getInstance());
     }

     /**
      * Initialize the context menu for the receiver.
      */
     private void initContextMenu() {
         MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
 Menu menu = menuMgr.createContextMenu(viewer.getControl());
         menuMgr.add(cancelAction);
         menuMgr.addMenuListener(new IMenuListener() {
             public void menuAboutToShow(IMenuManager manager) {
                 JobInfo info = getSelectedInfo();
                 if (info == null) {
                     return;
                 }
             }
         });
         menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
         getSite().registerContextMenu(menuMgr, viewer);
         viewer.getControl().setMenu(menu);
     }

     private void initPulldownMenu() {
         IMenuManager menuMgr = getViewSite().getActionBars().getMenuManager();
         menuMgr.add(clearAllAction);
         menuMgr.add(new ViewPreferencesAction() {
             /*
              * (non-Javadoc)
              *
              * @see org.eclipse.ui.internal.preferences.ViewPreferencesAction#openViewPreferencesDialog()
              */
             public void openViewPreferencesDialog() {
                 new JobsViewPreferenceDialog(viewer.getControl().getShell())
                         .open();

             }
         });

     }

     private void initToolBar() {
         IActionBars bars = getViewSite().getActionBars();
         IToolBarManager tm = bars.getToolBarManager();
         tm.add(clearAllAction);
     }

     /**
      * Return the selected objects. If any of the selections are not JobInfos or
      * there is no selection then return null.
      *
      * @return JobInfo[] or <code>null</code>.
      */
     private IStructuredSelection getSelection() {
         // If the provider has not been set yet move on.
 ISelectionProvider provider = getSite().getSelectionProvider();
         if (provider == null) {
             return null;
         }
         ISelection currentSelection = provider.getSelection();
         if (currentSelection instanceof IStructuredSelection) {
             return (IStructuredSelection) currentSelection;
         }
         return null;
     }

     /**
      * Get the currently selected job info. Only return it if it is the only
      * item selected and it is a JobInfo.
      *
      * @return JobInfo
      */
     JobInfo getSelectedInfo() {
         IStructuredSelection selection = getSelection();
         if (selection != null && selection.size() == 1) {
             JobTreeElement element = (JobTreeElement) selection
                     .getFirstElement();
             if (element.isJobInfo()) {
                 return (JobInfo) element;
             }
         }
         return null;
     }

     /**
      * Create the cancel action for the receiver.
      */
     private void createCancelAction() {
         cancelAction = new Action(ProgressMessages.ProgressView_CancelAction) {
             /*
              * (non-Javadoc)
              *
              * @see org.eclipse.jface.action.Action#run()
              */
             public void run() {
                 viewer.cancelSelection();
             }
         };

     }

     /**
      * Create the clear all action for the receiver.
      */
     private void createClearAllAction() {
         clearAllAction = new Action(
                 ProgressMessages.ProgressView_ClearAllAction) {
             /*
              * (non-Javadoc)
              *
              * @see org.eclipse.jface.action.Action#run()
              */
             public void run() {
                 FinishedJobs.getInstance().clearAll();
             }
         };
         clearAllAction
                 .setToolTipText(ProgressMessages.NewProgressView_RemoveAllJobsToolTip);
         ImageDescriptor id = WorkbenchImages
                 .getWorkbenchImageDescriptor("/elcl16/progress_remall.gif"); //$NON-NLS-1$
 if (id != null) {
             clearAllAction.setImageDescriptor(id);
         }
         id = WorkbenchImages
                 .getWorkbenchImageDescriptor("/dlcl16/progress_remall.gif"); //$NON-NLS-1$
 if (id != null) {
             clearAllAction.setDisabledImageDescriptor(id);
         }
     }

 }

